<?php
namespace zake\helper;

use zake\foundation\able\ListAble;

/**
 * 队列
 *
 * Class Queue
 * @package zake\helper
 */
class ArrayList implements ListAble
{
    /**
     * 元素载体
     * @var array
     */
    private $carrier = [];


    /**
     * 构造器
     * @param array $carrier
     * @return static
     *
     * @author liu.bin 2020-03-30 23:39
     */
    public static function create($carrier=[])
    {
        $self = new static($carrier);
        return $self;
    }


    /**
     * 构造器
     *
     * Queue constructor.
     * @param array $queue
     */
    public function __construct($carrier=[])
    {
        if($carrier && is_array($carrier)){
            $this->carrier = $carrier;
        }
    }


    /**
     * 获取队列中所有元素
     * @return array
     *
     * @author liu.bin 2020-03-24 22:19
     */
    public function all()
    {
        return array_values($this->carrier);
    }


    /**
     * 添加元素
     * @param int $index 索引
     * @param mixed $node 元素
     *
     * @return int
     * @author liu.bin 2020-03-24 22:08
     */
    public function add($index,$node)
    {
        if(!is_int($index)){
            return false;
        }
        $this->carrier[$index] = $node;
        return true;
    }


    /**
     * 将元素添加到头部
     * @param mixed $node
     * @return int
     * @author liu.bin 2020-03-31 00:00
     */
    public function addFirst($node)
    {
        return array_unshift($this->carrier,$node);
    }


    /**
     * 将元素添加到尾部
     *
     * @param mixed $node
     * @return int
     * @author liu.bin 2020-03-31 00:06
     */
    public function addLast($node)
    {
        return array_push($this->carrier,$node);
    }

    
    
    /**
     * 获取指定元素
     * @param $index
     * @param null|mixed $default
     *
     * @return mixed
     * @author liu.bin 2020-03-30 23:58
     */
    public function get($index,$default=null)
    {
        return $this->carrier[$index]??$default;
    }


    /**
     * 获取头部元素
     * @return mixed
     *
     * @author liu.bin 2020-03-31 00:09
     */
    public function getFirst()
    {
        return reset($this->carrier);
    }


    /**
     * 获取最后一个元素
     *
     * @return mixed
     * @author liu.bin 2020-03-31 00:09
     */
    public function getLast()
    {
        return end($this->carrier);
    }


    /**
     * addLast 别名
     * @param $node
     * @return int|mixed
     *
     * @author liu.bin 2020-03-31 00:15
     */
    public function push($node)
    {
        return $this->addLast($node);
    }


    /**
     * 弹出第一个元素
     * @return mixed
     *
     * @author liu.bin 2020-03-30 18:54
     */
    public function pop()
    {
        return array_shift($this->carrier);
    }



    /**
     * 是否存在
     *
     * @author liu.bin 2020-03-24 22:08
     */
    public function has($node)
    {
        return in_array($node,$this->carrier);
    }


    /**
     * 移除
     * @param $queueContainer
     * @param $node
     * @return bool
     *
     * @author liu.bin 2020-03-24 23:03
     */
    public function remove($node)
    {
        if($this->has($node)){
            $key = array_search($node,$this->carrier);
            unset($this->carrier[$key]);
        }
        return true;
    }


    /**
     * 返回当前队列长度
     *
     * @return int
     *
     * @author liu.bin 2020-03-30 18:41
     */
    public function size()
    {
        return count($this->carrier);
    }


    /**
     * 是否为空
     * @return bool
     *
     * @author liu.bin 2020-03-30 18:48
     */
    public function isEmpty()
    {
        return 0 === $this->size();
    }


    /**
     * 清空queue数据
     * @return bool
     *
     * @author liu.bin 2020-03-30 19:09
     */
    public function empty()
    {
        $this->carrier = [];
        return true;
    }


}